public class LeetCode70 {
    /**
     * 计算爬到指定楼梯顶部的不同方法数量。
     *
     * 假设你正在爬楼梯。需要 n 步才能到达楼顶。
     * 每次你可以选择爬 1 级或者 2 级台阶。计算有多少种不同的方法可以爬到楼顶。
     *
     * @param n 楼梯的总步数（即楼层数）
     * @return 爬到楼顶的方法总数
     */
    public int climbStairs(int n) {
        // 如果楼梯有 0 级台阶，视为有 1 种方法：即不动。
        if (n == 0) {
            return 1;
        }
        // 如果楼梯只有 1 级台阶，那么只有一种方法来爬这个楼梯。
        else if (n == 1) {
            return 1;
        }

        // 创建一个数组来存储到达每一级台阶的方法总数。
        // 数组长度为 n + 1 是为了方便索引，对应于从第 0 级到第 n 级台阶。
        int[] ways = new int[n + 1];

        // 这里对应上述两种基本情况：
        // 当楼梯有 0 级或 1 级时，分别有 1 种方法。
        ways[0] = 1;
        ways[1] = 1;

        // 使用动态规划填充数组。
        // 对于每个 i > 1，到达第 i 级台阶的方法数等于到达第 i-1 级和第 i-2 级的方法数之和。
        for (int i = 2; i <= n; i++) {
            ways[i] = ways[i - 1] + ways[i - 2];
        }

        // 返回到达第 n 级台阶的方法总数。
        return ways[n];
    }
}